package com.sophon.pattern.factory.abstractFactory;

import com.sophon.pattern.factory.vo.MainMaterial;
import com.sophon.pattern.factory.vo.MilkProduct;
import com.sophon.pattern.factory.vo.SpecialMaterial;

/**
 * 本类为一个抽象的牛奶工厂，其通过<code>makeMilk</code>方法生产牛奶<code>MilkProduct</code>。<br/><br/>
 * 制作一个牛奶成品需要有主料<code>MainMaterial</code>和特殊配料<code>SpecialMaterial</code>和品牌<code>brand</code>。
 * @author Andy G
 *
 */
public abstract class AbstractMilkFactory {

	/**
	 * 生产牛奶主料
	 * @return 主料
	 */
	abstract MainMaterial makeMainMaterial();

	/**
	 * 生产牛奶的特殊配料
	 * @return 特殊配料
	 */
	abstract SpecialMaterial makeSpecialMaterial();

	/**
	 * 制作牛奶的牌子
	 * @return 牛奶及牌子
	 */
	abstract MilkProduct makeBrand();

	/**
	 * 生产牛奶成品。
	 * @return 牛奶成品
	 */
	public MilkProduct makeMilk() {
		MilkProduct milk = makeBrand();
		milk.setMainMaterial(makeMainMaterial());
		milk.setSpecialMaterial(makeSpecialMaterial());
		return milk;
	}
}
